package lambdademo;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 86187
 * Date: 2022-08-24
 * Time: 20:42
 */

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
    void test(int a);
}

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
    void test(int a,int b);
}



//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
    int test();
}

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
    int test(int a);
}

//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
    int test(int a,int b);
}

public class TestLambda {

    /**
     *   有返回值有多个参数
     */
    public static void main(String[] args) {
        MoreParameterReturn moreParameterReturn = (x,y)->x+y;
        System.out.println(moreParameterReturn.test(4, 5));
    }

    /**
     *   有返回值有一个参数
     */
    public static void main5(String[] args) {
        OneParameterReturn oneParameterReturn = x -> 2 * x;//传入一个x 返回x 的两倍
        System.out.println(oneParameterReturn.test(10));
    }


    /**
     *   有返回值无参数
     */
    public static void main4(String[] args) {
        NoParameterReturn noParameterReturn = () -> {return 10;};
        int ret = noParameterReturn.test();
        System.out.println(ret);

        System.out.println("=======简化=======");
                        //此时return语句 只有一句话 可以将 return和花括号一起省略
        NoParameterReturn noParameterReturn2 = () -> 10;
        int ret2 = noParameterReturn2.test();
        System.out.println(ret2);
    }

    /**
     *   无返回值多个参数
     */
    public static void main3(String[] args) {
        MoreParameterNoReturn moreParameterNoReturn = (int x,int y) -> {
            System.out.println(x+y);
        };
        moreParameterNoReturn.test(10,20);

        System.out.println("简写：");
                                                //两个类型同时省略
        MoreParameterNoReturn moreParameterNoReturn2 = (x,y) -> System.out.println(x+y);
        moreParameterNoReturn2.test(20,30);

    }

    /**
     *   无返回值一个参数
     */
    public static void main2(String[] args) {
        OneParameterNoReturn oneParameterNoReturn = (int x) -> {
            System.out.println(x);
        };
        oneParameterNoReturn.test(520);
        System.out.println("=======简化=======");
        //当只有一个参数是 参数类型和小括号可以省略 如果方法体只有一句 花括号也可以省略
        OneParameterNoReturn oneParameterNoReturn2 = x -> System.out.println(x);
        oneParameterNoReturn2.test(13);
                                                    //此处的简化方式叫做 方法引用
        OneParameterNoReturn oneParameterNoReturn3 = System.out::println;
        oneParameterNoReturn2.test(14);
    }

    /**
     *   无返回值无参数
     */
    public static void main1(String[] args) {
        //不用 lambda 表达式
        NoParameterNoReturn noParameterNoReturn = new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("测试一下！");
            }
        };
        noParameterNoReturn.test();

        //用 lambda 表达式                               只有一个语句是 { } 可以省略
        NoParameterNoReturn noParameterNoReturn2 = () ->  System.out.println("测试1下！");
        noParameterNoReturn2.test();

        NoParameterNoReturn noParameterNoReturn3 = () ->  {
            System.out.println("测试1下！");
            System.out.println("测试2下！");
        };
        noParameterNoReturn3.test();
    }

}
